package ft.jsf.impl;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.input.DataFormat;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;

import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;

import java.io.File;
import java.util.List;
import java.util.Set;

import ft.jsf.cnst.C;
import ft.jsf.impl.JsfImpl;
import ft.jsf.util.StrUtil;

/**
 * JavaFx Controller 界面控件事件
 */
public class JsfController
{
	public TextArea txt1;
	public TextArea txt2;
	public Button btnSrcFix;
	public Button btnSrcFmt;
	public Button btnClipCopy;
	
	// 已隐藏
	public TextField txtXpath;
	public TextArea txtSelectResult;
	public Button btnSelectSingle;
	
//	public Button btnDecode;
	
	/**
	 * 输入源文件字符编码格式
	 */
	public ChoiceBox<String> ddlEnCode;
	
	public void initialize()
	{
		setControlHidden();
		setEnCodeDDL();
		setDragDropEvents();
	}
	
	/**
	 * 增加下拉框选项
	 */
	private void setEnCodeDDL()
	{
		{
			// ChoiceBox 增加子项
			ObservableList<String> lst = 
					FXCollections.observableArrayList(C.ENCODING_GBK, C.ENCODING_UTF8);
			ddlEnCode.setItems(lst);
			
			//设置默认选中值
			ddlEnCode.setValue(C.ENCODING_GBK);
		}
		
	}
	
	/**
	 * 获取 ddlEnCode 当前用户选中的值
	 * @return
	 */
	public String getEnCodeValue()
	{
		String ret = null;
		if(this.ddlEnCode!=null)
		{
			Object ob = ddlEnCode.getValue();
			if(ob!=null && ob instanceof java.lang.String)
			{
				ret = (java.lang.String)ob;
			}
		}
		return ret;
	}
	
	/**
	 * 设置某些控件隐藏，<br />
	 * 只设置 setVisible 没有用。
	 * 其实 setManaged 指定是否占据位置。
	 */
	private void setControlHidden()
	{
//		this.btnSelectSingle.setVisible(false);
		this.btnSelectSingle.setManaged(false);
		
//		this.txtXpath.setVisible(false);
//		this.txtXpath.setManaged(false);
		this.txtXpath.setEditable(false); // 不可编辑
		
//		this.txtSelectResult.setVisible(false);
		this.txtSelectResult.setManaged(false);
	}
	
	/**
	 * 设置 txt1 控件拖放
	 */
	private void setDragDropEvents()
	{
//		txt1.setOnDragEntered(new EventHandler<DragEvent>() {
//			@Override
//			public void handle(DragEvent event) {
//				/// DEBUG ///
//				//System.out.println("拖动开始！");
//				/// DEBUG ///
//				//event.acceptTransferModes(TransferMode.ANY);
//			}
//		});
		
		txt1.setOnDragOver(new EventHandler<DragEvent>() {

			@Override
			public void handle(DragEvent event) {
				// System.out.println("拖动 DragOver"); // 这里还是不要输出了，因为这里会疯狂调用超多次
				event.acceptTransferModes(TransferMode.ANY);
				
			}
			
		});
		
		txt1.setOnDragDropped(new EventHandler<DragEvent>() {

			@Override
			public void handle(DragEvent event) {
				/// DEBUG ///
				//System.out.println("拖动结束！");
				/// DEBUG ///
				
				Dragboard dd = event.getDragboard();
				
				// 该方法可以获得文字，比如从网页 HTML 上拖动过来的
//				String out_msg = dd.getString();
//				if(out_msg!=null && out_msg.length()>0)
//				{
//					txt1.setText(out_msg);
//				}
				
				Set<DataFormat> ds = dd.getContentTypes();
				if(ds.contains(DataFormat.FILES))
				{
					// 如果是文件
					_isFileDragDrop = true;
					
					/// DEBUG ///
					//System.out.println("拖放包含文件！");
					/// DEBUG ///
					
					List<File> fls = dd.getFiles();
					if(fls!=null && fls.size()>0)
					{
						File fl = fls.get(0); // 暂时只取第一个文件
						String fsname = null;
						try
						{
							fsname = fl.getCanonicalPath();
						}
						catch(Exception e)
						{
							// 有错误发生
						}
						
						if(fsname!=null && fsname.length()>0)
						{
							txtXpath.setText("获得文件路径：" + fsname);
							
							// 设置参数
							_src_path = fsname;
							cmdStartRun();
							
							// 执行完毕需要回写 src 至 txt1 控件
							if(txt1!=null && _src_str!=null && _src_str.length()>0 )
							{
								txt1.setText(_src_str);
							}
						}
					}
				}
				else if(ds.contains(DataFormat.PLAIN_TEXT))
				{
					
					_isFileDragDrop =false;
					
					/// DEBUG ///
					//System.out.println("拖放包含纯文本！");
					/// DEBUG ///
					
					String out_msg = dd.getString();
					if(out_msg!=null && out_msg.length()>0)
					{
						txt1.setText(out_msg);
					}
					
				}
				else
				{
					// 其他情况，忽略
					// isFileDragDrop = false;
				}
			}
		});
		
//		txt1.setOnDragDetected(new EventHandler<MouseEvent>() {
//
//			@Override
//			public void handle(MouseEvent event)
//			{
//				System.out.println("侦测到拖动！");
//			}
//			
//		});
	}
	
	/**
	 * 拖放进来的是否为文件，如果是，则需要针对磁盘读写，否则，仅操作文本框。
	 */
	private boolean _isFileDragDrop = false;
	
	private String _src_str = null;
	private String _src_path = null;
	private String _fix_str = null;
	private String _fix_path = null;
	
	/**
	 * 业务逻辑<br />
	 * 调用前需要先设定 _src_str src_path isFileDragDrop 等参数
	 */
	private void cmdStartRun()
	{
		JsfImpl r = new JsfImpl();
		if(_isFileDragDrop)
		{
			// 使用文件 读 _src_path 输出 _fix_path
			// 并将具体内容赋值给 _src_str _fix_str
			
			// 取当前使用的 Encode
			String myEncode = this.getEnCodeValue();
			
			
			// 准备一个新文件名，需要具体拆分文件扩展名
			String str_fix_path = null;
			{
				String str_suffix = "fix_" + StrUtil.getTs14();
				str_fix_path = StrUtil.fixSuffix(_src_path, str_suffix);
			}
			
			
			r.set_src_path(_src_path);
			r.set_fix_path(str_fix_path);
			r.set_encoding(myEncode);
			try
			{
				r.startRun();
			}
			catch(Exception e)
			{
				System.out.println(e.getMessage());
				e.printStackTrace();
			}
			
			String out_fix = r.get_fix_str();
			String out_src = r.get_src_str();
			
			if(out_src!=null && out_src.length()>0)
			{
				_src_str = out_src;
			}
			if(out_fix!=null && out_fix.length()>0)
			{
				_fix_str = out_fix;
			}
			
		}
		else
		{
			// 仅文本 _src_str _fix_str
//			JsfImpl r = new JsfImpl();
			r.set_src_str(_src_str);
			try
			{
				r.startRun();
			}
			catch(Exception e)
			{
				System.out.println(e.getMessage());
				e.printStackTrace();
			}
			String out_fix = r.get_fix_str();
			
			if(out_fix!=null && out_fix.length()>0)
			{
				_fix_str = out_fix;
			}
			
		}
		
		// 最终将结果输出至 txt2 控件
		if(txt2!=null && _fix_str!=null && _fix_str.length()>0)
		{
			txt2.setText(_fix_str);
		}
	}
	
	/**
	 * 按钮调用<br />
	 * 仅文本 SrcFix 清理
	 * @param event
	 */
	public void cmdSrcFix(ActionEvent event)
	{
		String str = this.txt1.getText();
		String fix = null;
		if(str!=null && str.length()>0)
		{
			// 既然是用按钮执行的，那么认定没有使用文件
			_isFileDragDrop = false;
			
			// 设置输入源代码
			_src_str = str;
			
			cmdStartRun();
			
//			ft.jsf.impl.JsfImpl r = new ft.jsf.impl.JsfImpl();
//			r.set_src_str(str);
//			try
//			{
//				r.startRun();
//			}
//			catch(Exception e)
//			{
//				System.out.print("有错误发生");
//				System.out.println(e.getMessage());
//				e.printStackTrace();
//			}
//			fix = r.get_fix_str();
//			fix = _fix_str;
			
//			if(fix!=null && fix.length()>0)
//			{
//				this.txt2.setText(fix);
//			}
			
			/// DEBUG ///
//			this.txtXpath.setText("命令成功完成。");
		}
	}
	
	/**
	 * 业务逻辑，SrcFmt格式化<br />
	 * 未实现。
	 * @param event
	 */
	public void cmdSrcFmt(ActionEvent event)
	{
		// NYI
		String msg = "cmdSrcFmt-NYI-该方法未实现";
//		System.out.println(msg);
		this.txtXpath.setText(msg);
	}
	
	/**
	 * 将 txt2 的文本复制到系统剪贴板
	 * @param event
	 */
	public void cmdClipCopy(ActionEvent event)
	{
		String str2 = txt2.getText();
		if(str2!=null && str2.length()>0)
		{
			Clipboard cp = Clipboard.getSystemClipboard();
			ClipboardContent ct = new ClipboardContent();
			ct.putString(str2);
			cp.setContent(ct);
			
			//System.out.println("复制到剪贴板。");
		}
	}
}
